#include "PacMan.h"
#include "Config.h"

/*
 * Constructeur faisant appel au constructeur de Mouvalble(héritage)
 * en utilisant les paramètres par défaut de celui-ci (0,0,0).
 * En effet les positions et déplacements du pacman seront fourni via getteur
 */
PacMan::PacMan() :
		Mouvable() {
	this->spin = 0;
	this->angleBouche = ANGLEENTIERFERME;
	this->angleBoucheDebut = ANGLEDEPARTFERME;
	this->angleBoucheEntier = ANGLEENTIERFERME;
	this->modeSuper = false;
	this->vieRestantes = LIFEPACMAN;
	this->angleBras = 0.0;
}

/*
 * Méthode permettant de faire une rotation de 90° du pacman vers la gauche
 */
void PacMan::turnLeft() {
	spin = spin + 90; // Sens antihorlogique
	if (spin > 360) { // Pour éviter les overflow
		spin = spin - 360;
	}
}

/*
 * Méthode permettant de faire une rotation de 90° du pacman vers la droite
 */
void PacMan::turnRight() {
	spin = spin - 90; // Sens antihorlogique
	if (spin > 360) { // Pour éviter les overflow
		spin = spin - 360;
	}
}

/*
 * Méthode permettant de faire une rotation de 180°
 */
void PacMan::turnBack() {
	spin = spin + 180; // Sens antihorlogique
	if (spin > 360) { // Pour éviter les overflow
		spin = spin - 360;
	}
}

/*
 * Méthode permettant de gérer l'animation de la bouche du pacman(2D)
 */
void PacMan::animBouche() {

	if (angleBoucheDebut == ANGLEDEPARTFERME) {
		angleBoucheDebut = ANGLEDEPARTOUVERT;
		angleBoucheEntier = ANGLEENTIEROUVERT;
	} else {
		angleBoucheDebut = ANGLEDEPARTFERME;
		angleBoucheEntier = ANGLEENTIERFERME;
	}
}

/*
 * Méthode permettant de mettre le pacman en mode SUPER
 */
void PacMan::setModeSuper(bool value) {
	modeSuper = value;
}

/*
 * Méthode permettant de mettre à jour les vie restantes du pacman
 */
void PacMan::setVieRestantes(int vieRestantes) {
	this->vieRestantes = vieRestantes;
}

/*
 * Méthode permettant de savoir si le pacman est en mouvement ou non
 */
bool PacMan::isIdle() const {
	return idle;
}

void PacMan::setAngleBoucheDebut(int angleBoucheDebut) {
	this->angleBoucheDebut = angleBoucheDebut;
}

/*
 * définit une direction pour le pacman et le déplacament à effectuer pour cette direction
 */
void PacMan::setLeftDirection() {
	this->previousDirection = this->currentDirection;
	this->currentDirection = LEFTDIRECTION; //enregistrement de la nouvelle direction
	this->deplacementX = -CELL_SIZE; //gauche == déplacement négatif sur l'axe des X
	this->deplacementY = 0; //gauche == aucun déplacment sur l'axe des Y
}

/*
 * définit une direction pour le pacman et le déplacament à effectuer pour cette direction
 */
void PacMan::setRightDirection() {
	this->currentDirection = RIGHTDIRECTION; //enregistrement nouvelle direction
	this->deplacementX = CELL_SIZE; //droite == déplacement position sur l'axe des X
	this->deplacementY = 0; //droite == aucun déplacment sur l'axe des Y
}

/*
 * définit une direction pour le pacman et le déplacament à effectuer pour cette direction
 */
void PacMan::setDownDirection() {
	this->currentDirection = DOWNDIRECTION; //enregistrement nouvelle direction
	this->deplacementX = 0; //bas == aucun déplacment sur l'axe des X
	this->deplacementY = CELL_SIZE; //bas == déplacement positif sur l'axe des Y
}

/*
 * définit une direction pour le pacman et le déplacament à effectuer pour cette direction
 */
void PacMan::setUpDirection() {
	this->currentDirection = UPDIRECTION; //enregistement nouvelle direction
	this->deplacementX = 0; //haut == aucun déplacment sur l'axe des X
	this->deplacementY = -CELL_SIZE; //haut == déplacement négatif sur l'axe des Y
}

/*
 * définit une direction pour le pacman et le déplacament à effectuer pour cette direction
 */
void PacMan::setAngleBoucheEntier(int angleBoucheEntier) {
	this->angleBoucheEntier = angleBoucheEntier;
}

/*
 * Méthode permettant de définir si le pacman est en mouvement ou pas
 */
void PacMan::setIdle(bool idle) {
	this->idle = idle;
}

/*
 * Méthode permettant de définir l'angle du bras du pacman
 */
void PacMan::setAngleBras(float angle) {
	this->angleBras = angle;
}

